﻿namespace LowCoding.Common
{
    public static class EnumExtensions
    {
        public static string GetEnumDescription(this Enum value)
        {
            ArgumentCheck.NotNull(value, "value");

            string description = value.ToString();
            var fieldInfo = value.GetType().GetField(description);
            if (fieldInfo != null)
            {
                var attributes =
                (EnumDescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(EnumDescriptionAttribute), false);
                if (attributes != null && attributes.Length > 0)
                {
                    description = attributes[0].Description;
                }
            }
            else
            {
                description = string.Empty;
            }
            return description;
        }

        /// <summary>
        /// 根据枚举值获取说明
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string GetEnumDescription<T>(this string value)
        {
            if (value.IsInt())
            {
                return ((Enum)Enum.Parse(typeof(T), value)).GetEnumDescription();
            }
            else
            {
                return string.Empty;
            }
        }

        /// <summary>
        /// 获取枚举值
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string GetEnumValue(this Enum value)
        {
            //检查value是否为空值
            ArgumentCheck.NotNull(value, "value");

            //不为空 转换value类型为string 传入定义的v变量中
            string v = value.ToString();
            //GetType:获取表示指定类型的 Type 对象。
            //GetField(String) 获取当前 Type 的特定字段
            //定义变量fieldInfo中的指定类型中的特定字段
            var fieldInfo = value.GetType().GetField(v);

            var attributes =
                (EnumValueAttribute[])fieldInfo.GetCustomAttributes(typeof(EnumValueAttribute), false);
            if (attributes != null && attributes.Length > 0)
            {
                v = attributes[0].Value;
            }
            return v;
        }
    }
}